home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / chgrp.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  101 lines

  1. /* chgrp  -  change group         Author: Bert Reuling */
  2.  
  3. /* This program is also chown.c */
  4. /*
  5.  * 89Dec07 Blayne Puklich Modified so that it checks its BASENAME
  6.  *        rather than the whole argv[0] to see who it should be.
  7.  *        Added slash(), which comes from dosread.c.
  8.  */
  9.  
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <ctype.h>
  13. #include <pwd.h>
  14. #include <grp.h>
  15. #include <stdio.h>
  16.  
  17. #ifndef TRUE
  18. #define TRUE  1
  19. #define FALSE 0
  20. #endif
  21.  
  22. char *slash( /* char *str */ );
  23.  
  24. main(argc, argv)
  25. int argc;
  26. char *argv[];
  27. {
  28.   int i, uid, gid, owner, status = 0;
  29.   struct passwd *pwd, *getpwuid(), *getpwnam();
  30.   struct group *grp, *getgrgid(), *getgrnam();
  31.   struct stat st;
  32.   char *name = slash(argv[0]);
  33.  
  34.   if (strcmp(name, "chown") == 0)
  35.     owner = TRUE;
  36.   else if (strcmp(name, "chgrp") == 0)
  37.     owner = FALSE;
  38.   else {
  39.     fprintf(stderr, "%s: should be named \"chown\" or \"chgrp\"\n", name);
  40.     exit(1);
  41.   }
  42.  
  43.   if (argc < 3) {
  44.     fprintf(stderr, 
  45.          "Usage: %s %s file ...\n", name, (owner) ? "owner" : "group");
  46.     exit(1);
  47.   }
  48.   if (isdigit(argv[1][0])) {
  49.     if (owner)
  50.         pwd = getpwuid(atoi(argv[1]));
  51.     else
  52.         grp = getgrgid(atoi(argv[1]));
  53.   } else {
  54.     if (owner)
  55.         pwd = getpwnam(argv[1]);
  56.     else
  57.         grp = getgrnam(argv[1]);
  58.   }
  59.  
  60.   if (owner && (pwd == (struct passwd *) 0)) {
  61.     fprintf(stderr, "%s: unknown user\n", name);
  62.     exit(1);
  63.   }
  64.   if (!owner && (grp == (struct group *) 0)) {
  65.     fprintf(stderr, "%s: unknown group\n", name);
  66.     exit(1);
  67.   }
  68.   for (i = 2; i < argc; i++) {
  69.     if (stat(argv[i], &st) != -1) {
  70.         if (owner) {
  71.             uid = pwd->pw_uid;    /* new owner */
  72.             gid = st.st_gid;    /* old group */
  73.         } else {
  74.             uid = st.st_uid;    /* old owner */
  75.             gid = grp->gr_gid;    /* new group */
  76.         }
  77.         if (chown(argv[i], uid, gid) == -1) {
  78.             fprintf(stderr, "%s: not changed\n", argv[i]);
  79.             status++;
  80.         }
  81.     } else {
  82.         perror(argv[i]);
  83.         status++;
  84.     }
  85.   }
  86.   exit(status);
  87. }
  88.  
  89. /* Stolen from dosread.c 89Dec07 Blayne Puklich */
  90.  
  91. char *slash(str)
  92. register char *str;
  93. {
  94.   register char *result = str;
  95.  
  96.   while (*str)
  97.     if (*str++ == '/') result = str;
  98.  
  99.   return result;
  100. }
  101.